From dddd88c891afd84a89dd3386a60610f1dba14e40 Mon Sep 17 00:00:00 2001 From: "kaf24@firebug.cl.cam.ac.uk" Date: Thu, 14 Jul 2005 11:09:21 +0000 Subject: [PATCH] Auto-disable IRQ balancing/affinity on buggy chipsets. Signed-off-by: Keir Fraser --- .../arch/xen/i386/kernel/Makefile | 4 ++-- .../arch/xen/x86_64/kernel/Makefile | 2 +- xen/arch/x86/dom0_ops.c | 18 ++++++++++++++++++ xen/arch/x86/irq.c | 2 +- xen/include/public/dom0_ops.h | 10 +++++++++- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile b/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile index fe6e9db107..a559ddc54e 100644 --- a/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile +++ b/linux-2.6-xen-sparse/arch/xen/i386/kernel/Makefile @@ -10,12 +10,12 @@ extra-y := head.o init_task.o obj-y := process.o signal.o entry.o traps.o \ time.o ioport.o ldt.o setup.o \ - pci-dma.o i386_ksyms.o irq.o + pci-dma.o i386_ksyms.o irq.o quirks.o c-obj-y := semaphore.o vm86.o \ ptrace.o sys_i386.o \ i387.o dmi_scan.o bootflag.o \ - doublefault.o quirks.o + doublefault.o s-obj-y := obj-y += cpu/ diff --git a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/Makefile b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/Makefile index 8b30e7c99b..ed4d0156f0 100644 --- a/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/Makefile +++ b/linux-2.6-xen-sparse/arch/xen/x86_64/kernel/Makefile @@ -51,7 +51,7 @@ topology-y += ../../../i386/mach-default/topology.o swiotlb-$(CONFIG_SWIOTLB) += ../../../ia64/lib/swiotlb.o microcode-$(subst m,y,$(CONFIG_MICROCODE)) += ../../../i386/kernel/microcode.o intel_cacheinfo-y += ../../../i386/kernel/cpu/intel_cacheinfo.o -quirks-y += ../../../i386/kernel/quirks.o +quirks-y += ../../i386/kernel/quirks.o c-link := init_task.o s-link := vsyscall.o diff --git a/xen/arch/x86/dom0_ops.c b/xen/arch/x86/dom0_ops.c index ff606ca1c7..b933cbdfaa 100644 --- a/xen/arch/x86/dom0_ops.c +++ b/xen/arch/x86/dom0_ops.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include @@ -371,6 +372,23 @@ long arch_do_dom0_op(dom0_op_t *op, dom0_op_t *u_dom0_op) } break; + case DOM0_PLATFORM_QUIRK: + { + extern int opt_noirqbalance; + switch ( op->u.platform_quirk.quirk_id ) + { + case QUIRK_NOIRQBALANCING: + printk("Platform quirk -- Disabling IRQ balancing/affinity.\n"); + opt_noirqbalance = 1; + setup_ioapic_dest(); + break; + default: + ret = -EINVAL; + break; + } + } + break; + default: ret = -ENOSYS; diff --git a/xen/arch/x86/irq.c b/xen/arch/x86/irq.c index c46811fd61..e0553486bc 100644 --- a/xen/arch/x86/irq.c +++ b/xen/arch/x86/irq.c @@ -16,7 +16,7 @@ #include /* opt_noirqbalance: If true, software IRQ balancing/affinity is disabled. */ -static int opt_noirqbalance = 0; +int opt_noirqbalance = 0; boolean_param("noirqbalance", opt_noirqbalance); irq_desc_t irq_desc[NR_IRQS]; diff --git a/xen/include/public/dom0_ops.h b/xen/include/public/dom0_ops.h index 2502edd75a..f5bad95bad 100644 --- a/xen/include/public/dom0_ops.h +++ b/xen/include/public/dom0_ops.h @@ -357,7 +357,7 @@ typedef struct { u64 cpu_time; } dom0_getvcpucontext_t; -#define DOM0_GETDOMAININFOLIST 38 +#define DOM0_GETDOMAININFOLIST 38 typedef struct { /* IN variables. */ domid_t first_domain; @@ -367,6 +367,13 @@ typedef struct { memory_t num_domains; } dom0_getdomaininfolist_t; +#define DOM0_PLATFORM_QUIRK 39 +#define QUIRK_NOIRQBALANCING 1 +typedef struct { + /* IN variables. */ + int quirk_id; +} dom0_platform_quirk_t; + typedef struct { u32 cmd; u32 interface_version; /* DOM0_INTERFACE_VERSION */ @@ -400,6 +407,7 @@ typedef struct { dom0_ioport_permission_t ioport_permission; dom0_getvcpucontext_t getvcpucontext; dom0_getdomaininfolist_t getdomaininfolist; + dom0_platform_quirk_t platform_quirk; } u; } dom0_op_t; -- 2.30.2